package com.evil.common.mongo.service;

import com.evil.common.mongo.entity.Name;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;

/**
 * @author liyang
 * @date 2024-06-14 09:37
 */
public interface Service<NAME extends Serializable, T extends Name<NAME>> {

    <M extends MongoRepository<T, NAME>> M getRepository();

    String name2Str(NAME name);

    String names2Str(Collection<NAME> names);

    String existMsg(NAME name);

    String existMsg(Collection<NAME> names);

    String notExistMsg(NAME name);

    String notExistMsg(Collection<NAME> names);

    void throwNotExist(NAME name);

    void throwNotExist(Collection<NAME> names);

    /**
     * 新增实体
     *
     * @param t t
     * @return T
     */
    T add(T t);

    /**
     * 是否存在实体
     *
     * @param name name
     * @return boolean
     */
    boolean existsByName(NAME name);

    /**
     * 获取实体
     *
     * @param name name
     * @return Optional
     */
    Optional<T> isExistByName(NAME name);

    /**
     * 获取实体
     *
     * @param name name
     * @return T
     */
    T findByName(NAME name);

    /**
     * 获取实体列表（数量不一致 会报错返回）
     *
     * @param names names
     * @return T列表
     */
    List<T> isExistByNames(Collection<NAME> names);

    /**
     * 获取实体列表（数量不一致 不会报错返回）
     *
     * @param names names
     * @return T列表
     */
    List<T> findByNames(Collection<NAME> names);

    /**
     * 获取实体列表（数量不一致 不会报错返回）
     *
     * @param names names
     * @return T map
     */
    Map<NAME, T> findMapByNames(Collection<NAME> names);

    /**
     * 更新实体
     *
     * @param t t
     * @return T
     */
    @Transactional(rollbackFor = Exception.class)
    T update(T t);

    /**
     * 更新实体
     *
     * @param t        t
     * @param consumer consumer
     * @return T
     */
    @Transactional(rollbackFor = Exception.class)
    T update(T t, Consumer<T> consumer);

    /**
     * 更新实体
     *
     * @param t        t
     * @param consumer consumer
     * @param callback callback
     * @return T
     */
    @Transactional(rollbackFor = Exception.class)
    T update(T t, Consumer<T> consumer, Consumer<T> callback);

    /**
     * 删除实体
     *
     * @param name name
     */
    void del(NAME name);

    void init(String suffix);

    List<T> readJsonFile(String suffix);
}
